import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class compilador {
 private String urlarchivo; 
 private xml readerdec;
 private xml readerasig;
 private xml readerstructure;
 private xml readercomment;
 private String validdatatype;
 private tabla stable;
 private boolean lenguaje;
 private boolean omitir;
 public compilador(){
  lenguaje=false;
  //Inicializar el documento que contiene el lenguaje
  readerdec=new xml("symbolos.xml");
  readerasig=new xml("symbolos.xml");
  readercomment=new xml("symbolos.xml");
  readerasig.addFiltro("tipo","asignacion");
  readerstructure=new xml("symbolos.xml");
  readerstructure.updFiltro("tipo","estructura");
  readerstructure.addFiltro("name","logica");
  readercomment.addFiltro("tipo","comentario");
  readercomment.addFiltro("name","linea");
  //Obtener expresiones generales
  readerdec.addFiltro("tipo","datatipo");
  String[] srt=readerdec.obtItems("TOKEN");
  String condiciones=new String("");
  for(int j=0;j<readerdec.getLength();j++)
  {
   if(j==0)
   {
    condiciones=condiciones+srt[j];
   }
   else
   {
    condiciones=condiciones+"|"+srt[j];
   }
  }
  validdatatype=new String(condiciones);
 }
 protected Object[] compilar(int fase,String expresion){
  boolean valida=false;
  String error=new String("");
  String tipodato="";
  switch(fase){
   case 0:
    //Comentarios de una linea
    readercomment.updFiltro("name","linea");
    String[] com=readercomment.obtItems("TOKEN");
    Matcher matcom=null;
    Pattern patcom=null;
    try{
     patcom=Pattern.compile(com[0]);
     matcom=patcom.matcher(expresion);
     if(matcom.find()){
      valida=true;
     }
     else
     {
      String[] errors=patcom.split(expresion);
       for(String s : errors){
        error=s;
      }
     }
    } catch(Exception e){
     e.printStackTrace();
    }
   break;
   case 1:
    // Analisis de declaracion
    readerdec.updFiltro("tipo","declaracion");    
    String[] dec=readerdec.obtItems("TOKEN");
    readerdec.updFiltro("tipo","validvar");
    String[] vardec=readerdec.obtItems("TOKEN");
    readerdec.updFiltro("tipo","validbeg");
    String[] stx=readerdec.obtItems("TOKEN");
    Matcher matdec=null;
    Pattern patdec=null;
    Pattern formdec=null;
    int x=0;
    try{
      //si tiene la forma de una declaracion entonces
      formdec=Pattern.compile(dec[0]);
      matdec=formdec.matcher(expresion);
      if(matdec.find()){
       patdec=Pattern.compile("("+validdatatype+") "+vardec[0]+"");
       matdec=patdec.matcher(expresion);
       if(matdec.find()){
        valida=true;
       }
       else{
        String[] errors=patdec.split(expresion);
        for(String s : errors){
         error=s;
        }
       }
      }
      else
      {
       String[] errors=formdec.split(expresion);
       for(String s : errors){
        error=s;
       }
      }
    }
    catch(Exception e){
     e.printStackTrace();
    }
   break;
   case 2:
    //Analisis de asignacion
    String[] asig=readerasig.obtItems("TOKEN");
    Matcher matasi=null;
    Pattern patasi=null;
    try{
     patasi=Pattern.compile(asig[0]);
     matasi=patasi.matcher(expresion);
     if(matasi.find()){  
      valida=true;
     }
     else
     {
      String[] errors=patasi.split(expresion);
       for(String s : errors){
        error=s;
      }
     }
    } catch(Exception e){
     e.printStackTrace();
    }
   break;
   case 3:
    //Analisis de estructuras logicas
    String[] estructura=readerstructure.obtItems("TOKEN"); 
    Matcher mataif=null;
    Pattern pataif=null;
    try{
     pataif=Pattern.compile(estructura[0]);
     mataif=pataif.matcher(expresion);
     if(mataif.find()){
      valida=true;
     }
     else
     {
      String[] errors=pataif.split(expresion);
       for(String s : errors){
        error=s;
      }
     }
    } catch(Exception e){
     e.printStackTrace();
    }
   break;
   default:
    //Comentarios para multiples lineas
    if(omitir==true)
    {
     valida=true;
    }
    else
    {
     readercomment.updFiltro("name","multilinea");
     String[] comm=readercomment.obtItems("TOKEN");
     Matcher matcomm=null;
     Pattern patcomm=null;
     try{
      patcomm=Pattern.compile(comm[0]);
      matcomm=patcomm.matcher(expresion);
      if(matcomm.find()){
       valida=true;
       omitir=true;
      }
      else
      {
       String[] errors=patcomm.split(expresion);
        for(String s : errors){
         error=s;
       }
       omitir=false;
      }
     } catch(Exception e){
      e.printStackTrace();
     }
    }
   
   //Identificar fin de comentario
     readercomment.updFiltro("name","finmultilinea");
     String[] commm=readercomment.obtItems("TOKEN");
     Matcher matcommm=null;
     Pattern patcommm=null;
     try{
      patcommm=Pattern.compile(commm[0]);
      matcommm=patcommm.matcher(expresion);
      if(matcommm.find()){
       omitir=false;
      }
     } catch(Exception e){
      e.printStackTrace();
     }
   break;
  }
  return new Object[]{valida,error};
 }
 
}
